package com.kehutong.wxapi.service.impl;

import com.kehutong.wxapi.request.BatchGetResultRequest;
import com.kehutong.wxapi.request.BatchReplacePartyRequest;
import com.kehutong.wxapi.request.BatchReplaceUserRequest;
import com.kehutong.wxapi.request.BatchSyncUserRequest;
import com.kehutong.wxapi.response.BatchGetResultResponse;
import com.kehutong.wxapi.response.BatchReplacePartyResponse;
import com.kehutong.wxapi.response.BatchReplaceUserResponse;
import com.kehutong.wxapi.response.BatchSyncUserResponse;
import com.kehutong.wxapi.service.BatchService;
import com.kehutong.wxapi.util.KhtClient;
import org.coraframework.inject.Inject;
import org.coraframework.json.JSON;
import org.coraframework.json.JSONObject;

/**
 * 异步批量服务类
 * @author: liukunlong
 * @date: 2021-03-08 18:46
 */
public class BatchServiceImpl implements BatchService {
    @Inject
    private KhtClient khtClient;
    /**
     * 增量更新成员
     * 本接口以userid（帐号）为主键，增量更新企业微信通讯录成员。请先下载CSV模板(下载增量更新成员模版)，根据需求填写文件内容。
     *
     * 注意事项：
     *
     * 模板中的部门需填写部门ID，多个部门用分号分隔，部门ID必须为数字，根部门的部门id默认为1
     * 文件中存在、通讯录中也存在的成员，更新成员在文件中指定的字段值
     * 文件中存在、通讯录中不存在的成员，执行添加操作
     * 通讯录中存在、文件中不存在的成员，保持不变
     * 成员字段更新规则：可自行添加扩展字段。文件中有指定的字段，以指定的字段值为准；文件中没指定的字段，不更新
     * 请求地址：https://qyapi.weixin.qq.com/cgi-bin/batch/syncuser?access_token=ACCESS_TOKEN
     * @param batchSyncUserRequest 增量更新成员请求对象
     * @return 增量更新成员响应对象
     * @throws Exception 异常
     */
    public BatchSyncUserResponse batchSyncUser(BatchSyncUserRequest batchSyncUserRequest) throws Exception{
        JSONObject jsonObject = khtClient.get("/cgi-bin/batch/syncuser", http -> {
            http.addParam("access_token", batchSyncUserRequest.getAccessToken());
            batchSyncUserRequest.setAccessToken(null);
            http.setBody(JSON.toJSONString(batchSyncUserRequest));
        });
        return JSON.parseObject(jsonObject.toJSONString(), BatchSyncUserResponse.class);
    }


    /**
     * 全量覆盖成员
     * 本接口以userid为主键，全量覆盖企业的通讯录成员，任务完成后企业的通讯录成员与提交的文件完全保持一致。请先下载CSV文件(下载全量覆盖成员模版)，根据需求填写文件内容。
     *
     * 注意事项：
     *
     * 模板中的部门需填写部门ID，多个部门用分号分隔，部门ID必须为数字，根部门的部门id默认为1
     * 文件中存在、通讯录中也存在的成员，完全以文件为准
     * 文件中存在、通讯录中不存在的成员，执行添加操作
     * 通讯录中存在、文件中不存在的成员，执行删除操作。出于安全考虑，下面两种情形系统将中止导入并返回相应的错误码。
     * 需要删除的成员多于50人，且多于现有人数的20%以上
     * 需要删除的成员少于50人，且多于现有人数的80%以上
     * 成员字段更新规则：可自行添加扩展字段。文件中有指定的字段，以指定的字段值为准；文件中没指定的字段，不更新
     * 请求地址：https://qyapi.weixin.qq.com/cgi-bin/batch/replaceuser?access_token=ACCESS_TOKEN
     * @param batchReplaceUserRequest 全量覆盖成员请求对象
     * @return 全量覆盖成员响应对象
     * @throws Exception 异常
     */
    public BatchReplaceUserResponse batchReplaceUser(BatchReplaceUserRequest batchReplaceUserRequest) throws Exception{
        JSONObject jsonObject = khtClient.get("/cgi-bin/batch/replaceuser", http -> {
            http.addParam("access_token", batchReplaceUserRequest.getAccessToken());
            batchReplaceUserRequest.setAccessToken(null);
            http.setBody(JSON.toJSONString(batchReplaceUserRequest));
        });
        return JSON.parseObject(jsonObject.toJSONString(), BatchReplaceUserResponse.class);
    }


    /**
     * 全量覆盖部门
     * 本接口以partyid为键，全量覆盖企业的通讯录组织架构，任务完成后企业的通讯录组织架构与提交的文件完全保持一致。请先下载CSV文件(下载全量覆盖部门模版)，根据需求填写文件内容。
     *
     * 注意事项：
     *
     * 文件中存在、通讯录中也存在的部门，执行修改操作
     * 文件中存在、通讯录中不存在的部门，执行添加操作
     * 文件中不存在、通讯录中存在的部门，当部门下没有任何成员或子部门时，执行删除操作
     * 文件中不存在、通讯录中存在的部门，当部门下仍有成员或子部门时，暂时不会删除，当下次导入成员把人从部门移出后自动删除
     * CSV文件中，部门名称、部门ID、父部门ID为必填字段，部门ID必须为数字，根部门的部门id默认为1；排序为可选字段，置空或填0不修改排序, order值大的排序靠前。
     * 请求地址：https://qyapi.weixin.qq.com/cgi-bin/batch/replaceparty?access_token=ACCESS_TOKEN
     * @param batchReplacePartyRequest 全量覆盖部门请求对象
     * @return 全量覆盖部门响应对象
     * @throws Exception 异常
     */
    public BatchReplacePartyResponse BatchReplaceParty(BatchReplacePartyRequest batchReplacePartyRequest) throws Exception{
        JSONObject jsonObject = khtClient.get("/cgi-bin/batch/replaceparty", http -> {
            http.addParam("access_token", batchReplacePartyRequest.getAccessToken());
            batchReplacePartyRequest.setAccessToken(null);
            http.setBody(JSON.toJSONString(batchReplacePartyRequest));
        });
        return JSON.parseObject(jsonObject.toJSONString(), BatchReplacePartyResponse.class);
    }


    /**
     * 获取异步任务结果
     * 请求地址：https://qyapi.weixin.qq.com/cgi-bin/batch/getresult?access_token=ACCESS_TOKEN&jobid=JOBID
     * @param batchGetResultRequest 获取异步任务结果请求对象
     * @return 获取异步任务结果响应对象
     * @throws Exception 异常
     */
    public BatchGetResultResponse batchGetResult(BatchGetResultRequest batchGetResultRequest) throws Exception{
        JSONObject jsonObject = khtClient.get("/cgi-bin/batch/replaceparty", http -> {
            http.addParam("access_token", batchGetResultRequest.getAccessToken());
            http.addParam("jobid",batchGetResultRequest.getJobid());
            http.setBody(JSON.toJSONString(batchGetResultRequest));
        });
        return JSON.parseObject(jsonObject.toJSONString(), BatchGetResultResponse.class);
    }
}
